home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / C Internet Config / IC Application Source ƒ / C Source ƒ / IC Install.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-06  |  7.5 KB  |  355 lines  |  [TEXT/SPM ]

  1. /*
  2.     IC Install.c
  3.     
  4. */
  5.  
  6. #include <Gestalt.h>
  7. #include <Folders.h>
  8. #include <Components.h>
  9.  
  10. #include "IC Types.h"
  11. #include "IC Component API.h"
  12. #include "IC Misc Subs.h"
  13. #include "IC Globals.h"
  14. #include "IC StandardFile.h"
  15. #include "IC Dialogs.h"
  16. #include "IC Subs.h"
  17. #include "IC API.h"
  18.  
  19. #include "IC Install.h"
  20.  
  21. #define registerCmpGlobal 1
  22. #define registerCmpNoDuplicates 2
  23. #define registerCmpAfter 4
  24.  
  25. long application_version,installed_version;
  26.  
  27. long GetVersionFromResFile(void){
  28.     VersRecHndl versh;
  29.     long ver;
  30.     long* lp;
  31.     
  32.     versh=(VersRecHndl)Get1Resource('vers',1);
  33.     if (versh==(VersRecHndl)0)
  34.         return 0;
  35.     
  36.     lp=(long*)&((*versh)->numericVersion);
  37.     ver=*lp;
  38.     ReleaseResource((Handle)versh);
  39.     
  40.     return ver;
  41. }
  42.  
  43. long GetRegisteredVersion(void){
  44.     ComponentInstance inst;
  45.     short refnum,oldref;
  46.     long ver=0L;
  47.     
  48.     if (Has_Components){
  49.         oldref=CurResFile();
  50.         
  51.         inst=OpenDefaultComponent(internetConfigurationComponentType,internetConfigurationComponentSubType);
  52.         if (inst!=(ComponentInstance)0){
  53.             refnum=OpenComponentResFile((Component)inst);
  54.             if (refnum!=-1){
  55.                 UseResFile(refnum);
  56.                 ver=GetVersionFromResFile();
  57.                 CloseComponentResFile(refnum);
  58.             }
  59.             CloseComponent(inst);
  60.         }
  61.         
  62.         UseResFile(oldref);
  63.     }
  64.     return ver;
  65. }
  66.  
  67. Boolean IsInstalled(FSSpec* where){
  68.     OSErr err;
  69.     short ndx;
  70.     Boolean found;
  71.     CInfoPBRec cpb;
  72.     FInfo info;
  73.     Str255 tstr;
  74.     
  75.     err=FindFolder(kOnSystemDisk,kExtensionFolderType,kCreateFolder,&where->vRefNum,&where->parID);
  76.     GetAString(tstr,128,12);
  77.     
  78.     SetPString(where->name,1,tstr);
  79.     
  80.     if (err==noErr){
  81.         err=HGetFInfo(where->vRefNum,where->parID,where->name,&info);
  82.         if (err!=noErr){
  83.             found=false;
  84.             ndx=1;
  85.             do {
  86.                 cpb.hFileInfo.ioNamePtr=where->name;
  87.                 cpb.hFileInfo.ioVRefNum=where->vRefNum;
  88.                 cpb.hFileInfo.ioDirID=where->parID;
  89.                 cpb.hFileInfo.ioFDirIndex=ndx++;
  90.                 
  91.                 err=PBGetCatInfoSync(&cpb);
  92.                 if (err==noErr)
  93.                     found=((cpb.hFileInfo.ioFlFndrInfo.fdType=='thng')&&(cpb.hFileInfo.ioFlFndrInfo.fdCreator==ICcreator));
  94.             } while ((!found)&&(err==noErr));
  95.             
  96.             if (!found){
  97.                 SetPString(where->name,1,tstr);
  98.                 err=fnfErr;
  99.             }
  100.         }
  101.     }
  102.     return (err==noErr);
  103. }
  104.  
  105. void UpdateInstalledVersion(FSSpec* fss){
  106.     short ref;
  107.     OSErr err;
  108.     
  109.     installed_version=0;
  110.     if (IsInstalled(fss)){
  111.         ref=HOpenResFile(fss->vRefNum,fss->parID,fss->name,fsRdPerm);
  112.         err=ResError();
  113.         if (err==noErr){
  114.             UseResFile(ref);
  115.             installed_version=GetVersionFromResFile();
  116.             CloseResFile(ref);
  117.         }
  118.     }
  119. }
  120.  
  121. OSErr SaveComponentToFile(FSSpec* fss){
  122.     OSErr err=noErr;
  123.     Handle thng;
  124.     short rref;
  125.     long sz;
  126.     
  127.     rref=128;
  128.     
  129.     // The following bit of code will choose the 'ThNg' resource to use
  130.     // based on the architecture.  Simply put, if this runs on a power pc
  131.     // the PPC component will be used; 68k gets the 68k component.
  132.     
  133.     err=Gestalt(gestaltSysArchitecture,&sz);
  134.     if (err==noErr){
  135.         if (BitTst(&sz,31-gestaltPowerPC))
  136.             rref=129;
  137.     }
  138.     
  139.     thng=GetResource('ThNg',rref);
  140.     
  141.     if (thng==(Handle)0)
  142.         err=resNotFound;
  143.     else {
  144.         HNoPurge(thng);
  145.         HCreate(fss->vRefNum,fss->parID,fss->name,ICcreator,'thng');
  146.         err=HOpenRF(fss->vRefNum,fss->parID,fss->name,fsRdWrPerm,&rref);
  147.         if (err==noErr){
  148.             err=SetEOF(rref,GetHandleSize(thng));
  149.             if (err==noErr){
  150.                 sz=GetHandleSize(thng);
  151.                 FSWrite(rref,&sz,*thng);
  152.             }
  153.             FSClose(rref);
  154.         }
  155.         HPurge(thng);
  156.         ReleaseResource(thng);
  157.     }
  158.     UpdateInstalledVersion(fss); // in case we are installing or saving the init
  159.     return err;
  160. }
  161.  
  162. OSErr RegisterFile(FSSpec* fss){
  163.     short ref;
  164.     OSErr err,err2;
  165.     long result;
  166.     
  167.     ref=HOpenResFile(fss->vRefNum,fss->parID,fss->name,fsRdPerm);
  168.     err=ResError();
  169.     if (err==noErr){
  170.         result=RegisterComponentResourceFile(ref,registerCmpGlobal);
  171.         if (result>0)
  172.             err=noErr;
  173.         else
  174.             err=(OSErr)result;
  175.         CloseResFile(ref);
  176.         err2=ResError();
  177.         if (err==noErr)
  178.             err=err2;
  179.     }
  180.     
  181.     return err;
  182. }
  183.  
  184. OSErr SaveICComponent(void){
  185.     OSErr err;
  186.     FSSpec fss;
  187.     Str255 prompt;
  188.     Str255 defName;
  189.     
  190.     GetAString(prompt,128,13);
  191.     GetAString(defName,128,12);
  192.     
  193.     err=ICStandardPutFile(prompt,defName,&fss);
  194.     if (err==noErr)
  195.         err=SaveComponentToFile(&fss);
  196.     
  197.     return err;
  198. }
  199.  
  200. OSErr JustInstallICComponent(void){
  201.     OSErr err;
  202.     FSSpec where;
  203.     
  204.     UpdateInstalledVersion(&where);
  205.     err=SaveComponentToFile(&where);
  206.     if (err==noErr)
  207.         if (Has_Components)
  208.             err=RegisterFile(&where);
  209.     
  210.     return err;
  211. }
  212.  
  213. OSErr InstallICComponent(void){
  214.     OSErr err=noErr;
  215.     FSSpec where;
  216.     Str255 prompt;
  217.     short junk;
  218.     long registered_version=0L;
  219.     
  220.     UpdateInstalledVersion(&where);
  221.     if (installed_version>0){
  222.         if (installed_version<application_version)
  223.             GetAString(prompt,128,17);
  224.         else if (installed_version<application_version)
  225.             GetAString(prompt,128,18);
  226.         else if (installed_version<application_version)
  227.             GetAString(prompt,128,19);
  228.         
  229.         ParamText(prompt,"\p","\p","\p");
  230.         InitCursor();
  231.         if (CautionAlert(145,gCancelModalFilter)!=ok)
  232.             err=userCanceledErr;
  233.     }
  234.     if (err==noErr)
  235.         err=JustInstallICComponent();
  236.     if (err==noErr){
  237.         InitCursor();
  238.         GetAString(prompt,128,20);
  239.         ParamText(prompt,"\p","\p","\p");
  240.         NoteAlert(142,(ModalFilterUPP)0);
  241.     }
  242.     
  243.     return err;
  244. }
  245.  
  246. OSErr RemoveICComponent(void){
  247.     OSErr err=noErr;
  248.     FSSpec fss;
  249.     
  250.     UpdateInstalledVersion(&fss);
  251.     if (installed_version>0)
  252.         err=HDelete(fss.vRefNum,fss.parID,fss.name);
  253.     if (err==noErr)
  254.         if (GetRegisteredVersion()>0)
  255.             NoteAlert(144,(ModalFilterUPP)0);
  256.     
  257.     UpdateInstalledVersion(&fss);
  258.     return err;
  259. }
  260.  
  261. void AdjustInstallMenu(short menu){
  262.     if (Has_Components)
  263.         SetItemEnable(GetMenuHandle(menu),IM_Install,installed_version<application_version);
  264.     else
  265.         SetItemEnable(GetMenuHandle(menu),IM_Install,false);
  266.     SetItemEnable(GetMenuHandle(menu),IM_Remove,installed_version>0);
  267. }
  268.  
  269. void DoInstallMenu(short menu,short item){
  270.     switch (item){
  271.         case IM_Install:
  272.             DisplayError(acInstallComponent,InstallICComponent());
  273.             break;
  274.         case IM_Save:
  275.             DisplayError(acInstallComponent,SaveICComponent());
  276.             break;
  277.         case IM_Remove:
  278.             DisplayError(acRemoveComponent,RemoveICComponent());
  279.             break;
  280.         default:
  281.             break;
  282.     }
  283. }
  284.  
  285. OSErr CheckICUsageVersion(void){
  286.     OSErr err,err2;
  287.     ComponentInstance component_instance;
  288.     ICInstance inst;
  289.     
  290.     err=ICMapErr(ICStart(&inst,ICcreator));
  291.     if (err==noErr){
  292.         err=ICMapErr(ICGetComponentInstance(inst,(Ptr*)&component_instance));
  293.         if (err==noErr){
  294.             if ((GetComponentVersion(component_instance)&0xffff0000)<(internetConfigurationComponentInterfaceVersion&0xffff0000))
  295.                 err=unimpErr;
  296.         } else
  297.             err=noErr; // we work fine without a component, we just can't deal with an old component
  298.         err2=ICMapErr(ICStop(inst));
  299.         if (err==noErr)
  300.             err=err2;
  301.     }
  302.     return err;
  303. }
  304.  
  305. OSErr InitializeComponentInstallation(void){
  306.     FSSpec fss;
  307.     OSErr err=noErr;
  308.     short a;
  309.     Str255 tstr;
  310.     long* lp=(long*)&(app_version.numericVersion);
  311.     
  312.     application_version=*lp;
  313.     UpdateInstalledVersion(&fss);
  314.     if (Has_Components){
  315.         if (installed_version<application_version){
  316.             InitCursor();
  317.             if (installed_version>0){
  318.                 a=NoteAlert(146,gCancelModalFilter);
  319.                 if (a!=ok)
  320.                     err=userCanceledErr;
  321.             } else {
  322.                 GetAString(tstr,128,8);
  323.                 ParamText(tstr,"\p","\p","\p");
  324.                 a=NoteAlert(141,gCancelModalFilter);
  325.             }
  326.             
  327.             if (a==ok){
  328.                 err=JustInstallICComponent();
  329.                 DisplayError(acInstallComponent,err);
  330.                 if (err==noErr){
  331.                     err=CheckICUsageVersion();
  332.                     if (err==noErr){
  333.                         InitCursor();
  334.                         GetAString(tstr,128,20);
  335.                         ParamText(tstr,"\p","\p","\p");
  336.                         a=NoteAlert(142,(ModalFilterUPP)0);
  337.                     } else {
  338.                         InitCursor();
  339.                         GetAString(tstr,128,26);
  340.                         ParamText(tstr,"\p","\p","\p");
  341.                         a=NoteAlert(142,(ModalFilterUPP)0);
  342.                         err=userCanceledErr;
  343.                     }
  344.                 }
  345.             }
  346.         }
  347.     }
  348.     
  349.     // ensure invariant that we are using the glue, or we are using the current version of the component
  350.     if (err==noErr)
  351.         err=CheckICUsageVersion();
  352.     
  353.     return err;
  354. }
  355.